package com.ww.exercise.coroutine.easy.q9

import kotlinx.coroutines.*
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlin.random.Random

suspend fun processUserData(userId: Int) {
    // 模拟不同的处理耗时
    val processingTime = Random.nextLong(500, 2000)
    delay(processingTime)
}

/**
 * runBlocking 会创建一个协程作用域，并且阻塞当前线程（这里是 main 线程），直到其作用域内所有 “直接子协程”（通过 launch 在该作用域内启动的协程）执行完毕
 */
fun main() = runBlocking(Dispatchers.Default) {
    val totalUsers = 50
    var completedCount = 0 // 已完成计数
    val mutex = Mutex()

    println("开始处理 $totalUsers 个用户数据...")

    // 启动50个协程处理用户数据
    val jobs = List(totalUsers) { userId ->
        launch {
            processUserData(userId + 1)
            mutex.withLock {
                completedCount++
                println("已完成 ${completedCount}/$totalUsers")
            }
        }
    }

    // 这里可以不用写，main()线程会自动等待所有子协程执行完成
    jobs.joinAll()

    println("全部处理完毕")
}